Bases de datos no relacionales

Introducción

Las bases de datos NoSQL están optimizadas para aplicaciones que requieren grandes volúmenes de datos, baja latencia y modelos de datos flexibles, lo que se logra mediante la flexibilización de algunas de las restricciones de consistencia de datos o por la existencia de un esquema fijo para el modelo de datos.

Este tipo de bases de datos se caracterizan porque no utilizan el esquema relacional, sino que utilizan un modelo de almacenamiento optimizado para el tipo de datos que van a almacenar. En este sentido encontramos datos que se pueden almacenar como pares clave-valor simple, como documentos JSON o como un grafo que consta de aristas y vértices.

Las bases de datos NoSQL se caracterizan por lo siguiente:

 

Motores de búsqueda

Un motor de búsqueda es un componente software que me permite realizar consultas de un modo algo diferente a como se realizan en una base de datos relacional.

En las bases de datos relacionales hay consultas muy complejas y que tienen un alto costo computacional. Además, hay tipos de consultas que no serían efectivas realizarlas en una base de datos relacional, pues podrían requerir de mucha capacidad de la base de datos, restándole capacidad para realizar otras consultas más críticas para el negocio.

Lo que buscamos con los motores de búsqueda es extraer toda la información puramente consultiva y moverla a otro lugar, de forma que podamos realizar consultas mucho más optimizadas.

Esta es la razón por lo que surgieron los motores de búsqueda.

 

Apache Lucene

Apache Lucene es una librería open source escrita en JAVA.

Implementa un motor de búsqueda de alto rendimiento.

 

Conceptos clave

A la hora de trabajar con Lucene, el índice es un concepto clave.

Un índice nos permite guardar información estructurada, y dentro de los índices tendremos documentos y metadatos asociados a ellos.

Habilita para realizar búsquedas:

 

Funcionamiento

Lucene funciona con índices inversos:

  1. Los documentos pasan por un tokenizador, que trocea los documentos en términos.

  2. Los tokens son insertados en los índices de Lucene.

  3. Cada término se asocia con una referencia al documento en el que aparece.

A la hora de buscar un término, el motor nos traerá los documentos asociados a dicho término.

 

Funcionamiento_Lucine

 

A la hora de trabajar con un motor de búsqueda hay dos fases:

  1. Indexación: a partir de unos datos en crudo, nuestra aplicación deberá indexar esos datos.

  2. Búsqueda: una vez indexados los datos, podremos realizar consultas sobre esos datos.

 

Fases_trabajo_motor_busqueda

 

No podemos considerar a Lucene como una base de datos, Lucene es un motor de búsqueda que esta pensado para hacer búsquedas sobre un snapshot de los datos.

Se puede considerar que implementa una base de datos no relacional orientada a documentos, pero no es un soporte válido para un sistema transaccional, no cumple con las propiedades ACID y no tiene garantía de la persistencia.

Debemos mantener nuestros datos en nuestra base de datos relacional y de forma síncrona realizar la indexación de los datos necesarios al motor de búsqueda, de tal forma, que a la hora de realizar consultas, las realizaremos a través del motor de búsqueda y el modelo de negocio lo mantendremos en nuestra bases de datos relacional.

 

Implementacion_motor_busqueda

 

Elasticsearch

Elasticsearch es un motor de búsqueda de datos y analítica desarrollado a partir de Lucene.

Elasticsearch es una plataforma que cubre Lucene y nos ofrece una forma mas cómoda de trabajar con el motor de búsqueda.

Permite gestionar diferentes tipos de datos:

Dado que está desarrollado a partir de Lucene, todas sus características están presentes.

Sin embargo:

 

Tipos de datos

Textuales

 

n-gramas

Ejemplo de n-gramas Search as you type

 

Objetos

Elasticsearch guarda la información como JSON.

 

Otros tipos

 

Consultas básicas

En Elasticsearch las consultas se realizan mediante JSON.

 

Bases de datos orientadas a documentos

El concepto central de una base de datos orientada a documentos es el documento.

Cada implementación de base de datos encapsulan y codifican los datos siguiendo algún formato estándar (JSON, BSON, XML, YAML...)

Al igual que en los sistemas de bases de datos relacionales los documentos actúan como registros (o filas), sin embargo, la flexibilidad hace que dos registros no sean iguales.

Ejemplo:

El primer documento solo tiene información básica de un empleado, en cambio el segundo documento tiene más información, añadiendo así más datos sobre el empleado.

 

Este tipo de base de datos es adecuado para la gestión de catálogos, perfiles de usuario, o sistemas de gestión de contenido donde cada documento es único y evoluciona con el tiempo.

 

MongoDB

MongoDB es una base de datos escalable y distribuida open source, que está diseñada para ser extremadamente rápida.

Es posible acceder a sus datos con SDKs para varios lenguajes de programación pero su lenguaje característico es MQL (MongoDB Query Language).

Su utiliza principalmente cuando se desea almacenar mucha información y que sea consumida de forma rápida, sin necesidad de transaccionalidad estricta y de integridad referencial (Aplicaciones Web, SaaS, Gaming…).

 

Elementos esenciales

 

Relacional_MongoDB

 

Colecciones

La colección es la agrupación principal de información en MongoDB y pueden crearse con anterioridad o la primera vez que son referenciadas (on-the-fly). Pensemos en ellas como las “tablas” que teníamos en bases de datos relacionales.

No hay schemas predefinidos, puesto que se almacenan documentos (JSON - BSON) que pueden variar.

 

Documentos

Son los elementos que se almacenan dentro de las colecciones y son indexables por una o varias claves.

Todos los documentos tienen un atributo _id que se asemeja a la PK de una tabla relacional.

En MongoDB solo se soportan dos tipos de relaciones:

Se almacenan en BSON (Binary JSON).

 

Documento_MongoDB

Documento MongoDB

 

Índices

Se pueden crear para cualquier campo de un documento.

Hay que tener en cuenta que los índices aplican las mismas consideraciones que los índices de las bases de datos relacionales, como el espacio.

Los documentos son indexables por una o varias claves.

 

Consultas

Consultas_MongoDB

Algunos tipos de consultas

 

JOINS

Se puede usar referencias para referenciar documentos relacionados. No hay integridad referencial auténtica.

 

Ejemplo_referencias_MongoDB

Ejemplo referencias

 

Una eliminación de un user no implicaría una eliminación de contact.

Si no se gestiona correctamente se pueden dar situaciones de orfandad.

Hay varios tipos de referenciación y dependen del caso de uso.

 

Referenciacion_MongoDB_1
Referenciacion_MongoDB_2
Referenciacion_MongoDB_3
Tipos de referenciación

 

Bases de datos clave-valor

Una base de datos clave-valor se asemeja a una tabla hash grande. Cada valor de datos está asociado con una clave única y se usará esta clave para almacenar los datos mediante el uso de una función hash apropiada.

Al igual que las bases de datos orientadas a documentos, las bases de datos clave-valor no necesitan que el esquema esté definido previamente.

Los sistemas de bases de datos clave-valor están muy optimizados para aplicaciones que realizan búsquedas simples mediante el valor de la clave, sin embargo, son menos adecuados para aquellas aplicaciones que necesitan consultar datos en diferentes tablas de claves-valores. Este tipo de base de datos es adecuada para mantener la sesión en las aplicaciones web o para almacenar el carro de la compra de un e-commerce.

 

Redis

Redis (Remote Dictionary Server) es una base de datos en memoria open source, que nos ofrece una base de datos que puede ser distribuida mediante el almacenamiento clave-valor con durabilidad configurable (TTL, Time To Live).

Su uso principal es como caché de peticiones HTTP, sesiones HTTP, cookies...

 

Uso_Redis

 

Las lecturas irán contra la caché Redis y las escrituras contra la base de datos principal. Esto se suele hacer para no saturar la base de datos con las lecturas.

 

Tipos de datos más utilizados

Strings

Redis almacena todo como Strings (Strings, Bytes, Integer, Floats, Booleans) y su tamaño máximo son 512MB.

 

List (Listas con repeticiones)
Set (Listas sin repeticiones)
Hashes

Ideal para almacenar objetos.

 

Amazon DynamoDB

DynamoDB es una base de datos clave-valor vitaminada, ya que tiene bastante más funcionalidades que otras bases de datos de este tipo.

Ofrece un servicio de base de datos no relacional totalmente gestionado (PaaS).

 

Estructura básica de una tabla

Nunca debió llamarse tabla. NO es una tabla de una base de datos relacional.

Estructura_tabla_DynamoDB

Ejemplo de "tabla" DynamoDB

 

En la tabla tenemos:

 

En DynamoDB solo tenemos dos operaciones de consulta:

Si nuestras consultas requieren SCAN o si necesito varios índices para las consultas de mi aplicación es porque DynamoDB no es la base de datos que debo utilizar.
El coste de elegir DynamoDB y equivocarse es muy elevado, tanto en dinero como en tiempo.

 

Índices en DynamoDB

 

Bases de datos orientadas a grafos

En las bases de datos orientadas a grafos se administran dos tipos de información: el nodo y la arista. Los nodos representan las entidades y las aristas representan las relaciones que las unen. Las aristas pueden tener dirección que indicará la naturaleza de la relación. Las aristas siempre deben tener un nodo de inicio, uno de final, un tipo y una dirección. No existe un límite para la cantidad ni el tipo de relaciones que un nodo puede tener.

Las bases de datos orientadas a grafos tienen una fuerte orientación semántica. Los diferentes nodos se interconectan mediante relaciones y a esa conjunción se le denomina tripleta. «sujeto» «verbo» «objeto».

Este tipo de bases de datos son muy utilizadas en redes sociales, en los sistemas de recomendación y en la detección de fraude, donde se necesita crear relaciones entre los datos y consultarlas rápidamente.

Actualmente existen diversas bases de datos orientadas a grafo, siendo Neo4j la más utilizada. También encontramos OrientDB, Infinite Graph o AllegroGraph.

 

BBDD_orientada_grafos

Grafo para representar las entidades y relaciones de la base de datos

 

 

 

Neo4J

Neo4J es una base de datos open source, que ofrece una base de datos que puede ser distribuida y que almacena información mediante la estructura de datos grafo.

Es posible acceder a sus datos con SDKs para varios lenguajes de programación, pero su lenguaje característico es Cypher.

 

Grafo_Neo4J

Ejemplo de grafo en Neo4J

 

Caso de uso

Se desea diseñar una base de datos usando Neo4J para almacenar información de alumnos y exámenes.

 

Estudiantes Notas

 

Parte I: Identificar Modelo de Grafo

Lo primero que debemos hacer es establecer el modelo de grafo en base a los datos que queremos almacenar y la forma por la que los vamos a consultar.

 

Modelo_grafo

Modelo de grafo

 

Parte II: Insertar datos

Con Cypher no existe el concepto de DDL. Simplemente insertamos datos y los relacionamos como queramos.

Nodos de profesores

 

Nodos de estudiante

 

Nodos de cursos

 

Parte III: Insertar relaciones
Relaciones entre cursos y profesores

 

Relaciones entre estudiantes y cursos

 

Grafo_resultante

Grafo resultante

 

Parte IV: Consultas

Tenemos que especificar mediante tripletas qué información tenemos (los filtros que estamos aplicando) y qué información no queremos (se quedará indicada, sin valor)

 

Ejemplo:

by Jose Manuel Pinillos